from django.contrib import admin
from .models import *
"""
这段代码主要完成了以下工作：
全局设置：修改了 Django 管理员界面的标题和头部信息，使其更符合项目需求。
Types 模型管理：
自动显示所有字段
支持按一级分类和二级分类搜索
支持按一级分类筛选
CommodityInfos 模型管理：
使用 fieldsets 组织表单，将相关字段分组并设置可折叠区域
设置排序规则和可排序列
自定义列表页显示的字段，包括添加自定义方法生成的字段
支持按类型筛选商品
提供分页和搜索功能
允许在列表页直接编辑商品名称
提供日期层次结构快速筛选
支持复制商品记录
表单自定义：
重写 formfield_for_dbfield 方法，自定义 types 字段的选择项，从 Types 模型中动态获取二级分类作为选项
这些配置大大增强了 Django 管理员界面的易用性，使后台管理人员能够更高效地管理商品和分类数据。
"""
# 注册模型到 Django 管理员界面
# admin.site.register(Types)
# admin.site.register(CommodityInfos)

# 修改 Django 管理员界面的标题和头部信息
admin.site.site_title = '母婴后台系统'  # 浏览器标签页标题
admin.site.site_header = '母婴电商后台管理系统'  # 登录页和主页头部标题
admin.site.index_title = '母婴平台管理'  # 主页左侧模块标题


@admin.register(Types)
class TypesAdmin(admin.ModelAdmin):
    # 设置在列表页显示的字段，使用模型元数据自动获取所有字段名
    list_display = [x for x in list(Types._meta._forward_fields_map.keys())]

    # 设置可搜索的字段，用户可通过这些字段进行搜索
    search_fields = ['firsts', 'seconds']

    # 设置过滤器，用户可通过此字段进行筛选
    list_filter = ['firsts']


@admin.register(CommodityInfos)
class CommodityInfosAdmin(admin.ModelAdmin):
    # 组织表单字段为不同的字段集，每个字段集有标题和样式
    fieldsets = (
        ('商品信息', {  # 第一个字段集的标题
            'fields': ('name', 'sezes', 'types', 'price', 'discount')  # 包含的字段
        }),
        ('收藏数量', {  # 第二个字段集的标题
            'classes': ('collapse',),  # 设置为可折叠样式
            'fields': ('likes',),  # 包含的字段
        }),
    )

    # 设置排序方式，按 ID 升序排列
    ordering = ['id']

    # 设置可排序的字段，用户可点击列标题进行排序
    sortable_by = ['price', 'discount']

    # 设置列表页显示的字段，并动态添加一个自定义方法生成的字段
    list_display = ['id', 'name', 'sezes', 'types', 'price', 'discount']
    list_display.append('colored_name')  # 添加自定义方法生成的彩色名称字段

    # 设置列表页的过滤器，用户可通过此字段进行筛选
    list_filter = ['types']

    # 设置每页显示的记录数
    list_per_page = 100

    # 设置一次性显示的最大记录数
    list_max_show_all = 200

    # 设置可在列表页直接编辑的字段
    list_editable = ['name']

    # 设置可搜索的字段
    search_fields = ['name', 'types']

    # 设置日期层次结构，用户可通过日期快速筛选
    date_hierarchy = 'created'

    # 启用"另存为"功能，允许复制记录
    save_as = True

    # 重写表单字段方法，自定义特定字段的行为
    def formfield_for_dbfield(self, db_field, **kwargs):
        # 自定义 types 字段的选择项，从 Types 模型中获取 seconds 字段的值
        if db_field.name == 'types':
            db_field.choices = [(x['seconds'], x['seconds']) for x in Types.objects.values('seconds')]
        return super().formfield_for_dbfield(db_field, **kwargs)